package com.xiaoger.producer.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


/**
 * 直接交换机配置（direct exchange）
 * 大致流程，有一个队列绑定到一个直连交换机上，同时赋予一个路由键 routing key 。
 * 然后当一个消息携带着路由值为X，这个消息通过生产者发送给交换机时，交换机就会根据这个路由值X去寻找绑定值也是X的队列。
 *
 * @author xjx
 * @date 2022/6/6 14:39
 */
@Configuration
public class DirectRabbitConfig {

    /**
     * 创建一个直接交换机的队列,名称为：TestDirectQueue
     *
     * @return queue
     */
    @Bean
    public Queue directQueue() {
        // durable:是否持久化,默认是false,持久化队列：会被存储在磁盘上，当消息代理重启时仍然存在，暂存队列：当前连接有效
        // exclusive:默认也是false，只能被当前创建的连接使用，而且当连接关闭后队列即被删除。此参考优先级高于durable
        // autoDelete:是否自动删除，当没有生产者或者消费者使用此队列，该队列会自动删除。
        //   return new Queue("TestDirectQueue",true,true,false);
        return new Queue("TestDirectQueue", true);
    }

    /**
     * 创建一个直接交换机,名称为：TestDirectExchange
     *
     * @return DirectExchange
     */
    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange("TestDirectExchange", true, false);
    }

    /**
     * 将队列和直接交换机进行绑定，设置绑定的路由键为：TestDirectRouting
     *
     * @return
     */
    @Bean
    public Binding bindingDirect() {
        return BindingBuilder.bind(directQueue()).to(directExchange()).with("TestDirectRouting");
    }

    /**
     * 单独的一个交换机，没有绑定任何队列，用来测试回调函数对于这种情况应该返回什么数据
     */
    @Bean
    DirectExchange lonelyDirectExchange() {
        return new DirectExchange("lonelyDirectExchange");
    }
}
